home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Games / MAME / src / cpu / ccpu / ccpudasm.c < prev    next >
C/C++ Source or Header  |  1999-03-31  |  14KB  |  494 lines

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include "ccpu.h"
  4.  
  5. #define CCPU_FETCH(A)    cpu_readop(A)
  6.  
  7. /*
  8.  * opcode tables for debugging
  9.  */
  10. typedef enum {
  11.   CLR,  LDA,  INP,  ADD,  SUB,  LDJ,  LDP,  OUT,
  12.   CMP,  LDI,  STA,  VIN,  VDR,  XLT,  MUL,  LLT,
  13.   WAI,  AWD,  AND,  LSR,  LSL,  ASR,  ASRD, LSLD,
  14.   JPPB, JMIB, JDRB, JLTB, JEQB, JNCB, JAOB, NOPB,
  15.   JMPA, JMIA, JDRA, JLTA, JEQA, JNCA, JAOA, NOPA,
  16.   JEIA, JEIB
  17. } opcode_mnemonics;
  18.  
  19. typedef struct {
  20.   opcode_mnemonics od_opcode;
  21.   char *od_name;
  22. } opcode_detail;
  23.  
  24. opcode_detail opcodes[] = {
  25.   { CLR, "clr" },
  26.   { LDA, "lda" },
  27.   { INP, "inp" },
  28.   { ADD, "add" },
  29.   { SUB, "sub" },
  30.   { LDJ, "ldj" },
  31.   { LDP, "ldp" },
  32.   { OUT, "out" },
  33.   { CMP, "cmp" },
  34.   { LDI, "ldi" },
  35.   { STA, "sta" },
  36.   { VIN, "vin" },
  37.   { VDR, "vdr" },
  38.   { XLT, "xlt" },
  39.   { MUL, "mul" },
  40.   { LLT, "llt" },
  41.   { WAI, "wai" },
  42.   { AWD, "awd" },
  43.   { AND, "and" },
  44.   { LSR, "lsr" },
  45.   { LSL, "lsl" },
  46.   { ASR, "asr" },
  47.   { ASRD, "asrd" },
  48.   { LSLD, "lsld" },
  49.   { JPPB, "jppb" },
  50.   { JMIB, "jmib" },
  51.   { JDRB, "jdrb" },
  52.   { JLTB, "jltb" },
  53.   { JEQB, "jeqb" },
  54.   { JNCB, "jncb" },
  55.   { JAOB, "jaob" },
  56.   { NOPB, "nopb" },
  57.   { JMPA, "jmpa" },
  58.   { JMIA, "jmia" },
  59.   { JDRA, "jdra" },
  60.   { JLTA, "jlta" },
  61.   { JEQA, "jeqa" },
  62.   { JNCA, "jnca" },
  63.   { JAOA, "jaoa" },
  64.   { NOPA, "nopa" },
  65.   { JEIA, "jeia" },
  66.   { JEIB, "jeib" }
  67. };
  68.  
  69. typedef enum {
  70.   ACC,      // Accumulator
  71.   ADIR,     // Acc Direct memory access
  72.   AIM4,     // Acc 4 bit immediate
  73.   AIM4X,    // Acc 4 bit immediate extended size
  74.   AIM8,     // Acc 8 bit immediate
  75.   AINDM,    // Acc indirect through memory
  76.   AIMX,     // Acc immediate extended A-reg
  77.   AXLT,     // Acc lookup ROM using Acc as pointer
  78.   AIRG,     // Acc Through the I-reg
  79.   IRG,      // Through the I-reg
  80.   IM4,      // 4 bit immediate
  81.   IM12,     // 12 bit immediate
  82.   DIR,      // Direct memory access
  83.   IMP,      // Implied
  84.   JUMP,     // Acc selection/Jump instruction
  85.   JUMPX     // Acc selection/Extended jump instruction
  86. } amode_mnemonics;
  87.  
  88. typedef struct {
  89.   amode_mnemonics ad_amode;
  90.   char *ad_name;
  91. } amode_detail;
  92.  
  93. amode_detail amodes[] = {
  94.   { ACC,   "acc" },
  95.   { ADIR,  "adir" },
  96.   { AIM4,  "aim4" },
  97.   { AIM4X, "aim4x" },
  98.   { AIM8,  "aim8" },
  99.   { AINDM, "aindm" },
  100.   { AIMX,  "aimx" },
  101.   { AXLT,  "axlt" },
  102.   { AIRG,  "airg" },
  103.   { IRG,   "irg" },
  104.   { IM4,   "im4" },
  105.   { IM12,  "im12" },
  106.   { DIR,   "dir" },
  107.   { IMP,   "imp" },
  108.   { JUMP,  "jump" },
  109.   { JUMPX, "jumpx" }
  110. };
  111.  
  112. typedef struct {
  113.   opcode_mnemonics ot_opcode;
  114.   amode_mnemonics  ot_amode;
  115. } opcode_table_entry;
  116.  
  117. opcode_table_entry opcode_table[] = {
  118.   { CLR, ACC   },           // 00
  119.   { LDA, AIM4X },           // 01
  120.   { LDA, AIM4X },           // 02
  121.   { LDA, AIM4X },           // 03
  122.   { LDA, AIM4X },           // 04
  123.   { LDA, AIM4X },           // 05
  124.   { LDA, AIM4X },           // 06
  125.   { LDA, AIM4X },           // 07
  126.   { LDA, AIM4X },           // 08
  127.   { LDA, AIM4X },           // 09
  128.   { LDA, AIM4X },           // 0A
  129.   { LDA, AIM4X },           // 0B
  130.   { LDA, AIM4X },           // 0C
  131.   { LDA, AIM4X },           // 0D
  132.   { LDA, AIM4X },           // 0E
  133.   { LDA, AIM4X },           // 0F
  134.  
  135.   { INP, ADIR },            // 10
  136.   { INP, ADIR },            // 11
  137.   { INP, ADIR },            // 12
  138.   { INP, ADIR },            // 13
  139.   { INP, ADIR },            // 14
  140.   { INP, ADIR },            // 15
  141.   { INP, ADIR },            // 16
  142.   { INP, ADIR },            // 17
  143.   { INP, ADIR },            // 18
  144.   { INP, ADIR },            // 19
  145.   { INP, ADIR },            // 1A
  146.   { INP, ADIR },            // 1B
  147.   { INP, ADIR },            // 1C
  148.   { INP, ADIR },            // 1D
  149.   { INP, ADIR },            // 1E
  150.   { INP, ADIR },            // 1F
  151.  
  152.   { ADD, AIM8 },            // 20
  153.   { ADD, AIM4 },            // 21
  154.   { ADD, AIM4 },            // 22
  155.   { ADD, AIM4 },            // 23
  156.   { ADD, AIM4 },            // 24
  157.   { ADD, AIM4 },            // 25
  158.   { ADD, AIM4 },            // 26
  159.   { ADD, AIM4 },            // 27
  160.   { ADD, AIM4 },            // 28
  161.   { ADD, AIM4 },            // 29
  162.   { ADD, AIM4 },            // 2A
  163.   { ADD, AIM4 },            // 2B
  164.   { ADD, AIM4 },            // 2C
  165.   { ADD, AIM4 },            // 2D
  166.   { ADD, AIM4 },            // 2E
  167.   { ADD, AIM4 },            // 2F
  168.  
  169.   { SUB, AIM8 },            // 30
  170.   { SUB, AIM4 },            // 31
  171.   { SUB, AIM4 },            // 32
  172.   { SUB, AIM4 },            // 33
  173.   { SUB, AIM4 },            // 34
  174.   { SUB, AIM4 },            // 35
  175.   { SUB, AIM4 },            // 36
  176.   { SUB, AIM4 },            // 37
  177.   { SUB, AIM4 },            // 38
  178.   { SUB, AIM4 },            // 39
  179.   { SUB, AIM4 },            // 3A
  180.   { SUB, AIM4 },            // 3B
  181.   { SUB, AIM4 },            // 3C
  182.   { SUB, AIM4 },            // 3D
  183.   { SUB, AIM4 },            // 3E
  184.   { SUB, AIM4 },            // 3F
  185.  
  186.   { LDJ, IM12 },            // 40
  187.   { LDJ, IM12 },            // 41
  188.   { LDJ, IM12 },            // 42
  189.   { LDJ, IM12 },            // 43
  190.   { LDJ, IM12 },            // 44
  191.   { LDJ, IM12 },            // 45
  192.   { LDJ, IM12 },            // 46
  193.   { LDJ, IM12 },            // 47
  194.   { LDJ, IM12 },            // 48
  195.   { LDJ, IM12 },            // 49
  196.   { LDJ, IM12 },            // 4A
  197.   { LDJ, IM12 },            // 4B
  198.   { LDJ, IM12 },            // 4C
  199.   { LDJ, IM12 },            // 4D
  200.   { LDJ, IM12 },            // 4E
  201.   { LDJ, IM12 },            // 4F
  202.  
  203.   { JPPB, JUMP },           // 50
  204.   { JMIB, JUMP },           // 51
  205.   { JDRB, JUMP },           // 52
  206.   { JLTB, JUMP },           // 53
  207.   { JEQB, JUMP },           // 54
  208.   { JNCB, JUMP },           // 55
  209.   { JAOB, JUMP },           // 56
  210.   { NOPB, IMP },            // 57
  211.  
  212.   { JMPA, JUMP },           // 58
  213.   { JMIA, JUMP },           // 59
  214.   { JDRA, JUMP },           // 5A
  215.   { JLTA, JUMP },           // 5B
  216.   { JEQA, JUMP },           // 5C
  217.   { JNCA, JUMP },           // 5D
  218.   { JAOA, JUMP },           // 5E
  219.   { NOPA, IMP },            // 5F
  220.  
  221.   { ADD, ADIR },            // 60
  222.   { ADD, ADIR },            // 61
  223.   { ADD, ADIR },            // 62
  224.   { ADD, ADIR },            // 63
  225.   { ADD, ADIR },            // 64
  226.   { ADD, ADIR },            // 65
  227.   { ADD, ADIR },            // 66
  228.   { ADD, ADIR },            // 67
  229.   { ADD, ADIR },            // 68
  230.   { ADD, ADIR },            // 69
  231.   { ADD, ADIR },            // 6A
  232.   { ADD, ADIR },            // 6B
  233.   { ADD, ADIR },            // 6C
  234.   { ADD, ADIR },            // 6D
  235.   { ADD, ADIR },            // 6E
  236.   { ADD, ADIR },            // 6F
  237.  
  238.   { SUB, ADIR },            // 70
  239.   { SUB, ADIR },            // 71
  240.   { SUB, ADIR },            // 72
  241.   { SUB, ADIR },            // 73
  242.   { SUB, ADIR },            // 74
  243.   { SUB, ADIR },            // 75
  244.   { SUB, ADIR },            // 76
  245.   { SUB, ADIR },            // 77
  246.   { SUB, ADIR },            // 78
  247.   { SUB, ADIR },            // 79
  248.   { SUB, ADIR },            // 7A
  249.   { SUB, ADIR },            // 7B
  250.   { SUB, ADIR },            // 7C
  251.   { SUB, ADIR },            // 7D
  252.   { SUB, ADIR },            // 7E
  253.   { SUB, ADIR },            // 7F
  254.  
  255.   { LDP, IM4  },            // 80
  256.   { LDP, IM4  },            // 81
  257.   { LDP, IM4  },            // 82
  258.   { LDP, IM4  },            // 83
  259.   { LDP, IM4  },            // 84
  260.   { LDP, IM4  },            // 85
  261.   { LDP, IM4  },            // 86
  262.   { LDP, IM4  },            // 87
  263.   { LDP, IM4  },            // 88
  264.   { LDP, IM4  },            // 89
  265.   { LDP, IM4  },            // 8A
  266.   { LDP, IM4  },            // 8B
  267.   { LDP, IM4  },            // 8C
  268.   { LDP, IM4  },            // 8D
  269.   { LDP, IM4  },            // 8E
  270.   { LDP, IM4  },            // 8F
  271.  
  272.   { OUT, ADIR },            // 90
  273.   { OUT, ADIR },            // 91
  274.   { OUT, ADIR },            // 92
  275.   { OUT, ADIR },            // 93
  276.   { OUT, ADIR },            // 94
  277.   { OUT, ADIR },            // 95
  278.   { OUT, ADIR },            // 96
  279.   { OUT, ADIR },            // 97
  280.   { OUT, ADIR },            // 98
  281.   { OUT, ADIR },            // 99
  282.   { OUT, ADIR },            // 9A
  283.   { OUT, ADIR },            // 9B
  284.   { OUT, ADIR },            // 9C
  285.   { OUT, ADIR },            // 9D
  286.   { OUT, ADIR },            // 9E
  287.   { OUT, ADIR },            // 9F
  288.  
  289.   { LDA, ADIR },            // A0
  290.   { LDA, ADIR },            // A1
  291.   { LDA, ADIR },            // A2
  292.   { LDA, ADIR },            // A3
  293.   { LDA, ADIR },            // A4
  294.   { LDA, ADIR },            // A5
  295.   { LDA, ADIR },            // A6
  296.   { LDA, ADIR },            // A7
  297.   { LDA, ADIR },            // A8
  298.   { LDA, ADIR },            // A9
  299.   { LDA, ADIR },            // AA
  300.   { LDA, ADIR },            // AB
  301.   { LDA, ADIR },            // AC
  302.   { LDA, ADIR },            // AD
  303.   { LDA, ADIR },            // AE
  304.   { LDA, ADIR },            // AF
  305.  
  306.   { CMP, ADIR },            // B0
  307.   { CMP, ADIR },            // B1
  308.   { CMP, ADIR },            // B2
  309.   { CMP, ADIR },            // B3
  310.   { CMP, ADIR },            // B4
  311.   { CMP, ADIR },            // B5
  312.   { CMP, ADIR },            // B6
  313.   { CMP, ADIR },            // B7
  314.   { CMP, ADIR },            // B8
  315.   { CMP, ADIR },            // B9
  316.   { CMP, ADIR },            // BA
  317.   { CMP, ADIR },            // BB
  318.   { CMP, ADIR },            // BC
  319.   { CMP, ADIR },            // BD
  320.   { CMP, ADIR },            // BE
  321.   { CMP, ADIR },            // BF
  322.  
  323.   { LDI, DIR  },            // C0
  324.   { LDI, DIR  },            // C1
  325.   { LDI, DIR  },            // C2
  326.   { LDI, DIR  },            // C3
  327.   { LDI, DIR  },            // C4
  328.   { LDI, DIR  },            // C5
  329.   { LDI, DIR  },            // C6
  330.   { LDI, DIR  },            // C7
  331.   { LDI, DIR  },            // C8
  332.   { LDI, DIR  },            // C9
  333.   { LDI, DIR  },            // CA
  334.   { LDI, DIR  },            // CB
  335.   { LDI, DIR  },            // CC
  336.   { LDI, DIR  },            // CD
  337.   { LDI, DIR  },            // CE
  338.   { LDI, DIR  },            // CF
  339.  
  340.   { STA, ADIR },            // D0
  341.   { STA, ADIR },            // D1
  342.   { STA, ADIR },            // D2
  343.   { STA, ADIR },            // D3
  344.   { STA, ADIR },            // D4
  345.   { STA, ADIR },            // D5
  346.   { STA, ADIR },            // D6
  347.   { STA, ADIR },            // D7
  348.   { STA, ADIR },            // D8
  349.   { STA, ADIR },            // D9
  350.   { STA, ADIR },            // DA
  351.   { STA, ADIR },            // DB
  352.   { STA, ADIR },            // DC
  353.   { STA, ADIR },            // DD
  354.   { STA, ADIR },            // DE
  355.   { STA, ADIR },            // DF
  356.  
  357.   { VDR, IMP  },            // E0
  358.   { LDJ, IRG  },            // E1
  359.   { XLT, AXLT },            // E2
  360.   { MUL, IRG  },            // E3
  361.   { LLT, IMP  },            // E4
  362.   { WAI, IMP  },            // E5
  363.   { STA, AIRG },            // E6
  364.   { ADD, AIRG },            // E7
  365.   { SUB, AIRG },            // E8
  366.   { AND, AIRG },            // E9
  367.   { LDA, AIRG },            // EA
  368.   { LSR, ACC  },            // EB
  369.   { LSL, ACC  },            // EC
  370.   { ASR, ACC  },            // ED
  371.   { ASRD, IMP },            // EE
  372.   { LSLD, IMP },            // EF
  373.  
  374.   { VIN, IMP  },            // F0
  375.   { LDJ, IRG  },            // F1
  376.   { XLT, AXLT },            // F2
  377.   { MUL, IRG  },            // F3
  378.   { LLT, IMP  },            // F4
  379.   { WAI, IMP  },            // F5
  380.   { STA, AIRG },            // F6
  381.   { AWD, AIRG },            // F7
  382.   { SUB, AIRG },            // F8
  383.   { AND, AIRG },            // F9
  384.   { LDA, AIRG },            // FA
  385.   { LSR, ACC  },            // FB
  386.   { LSL, ACC  },            // FC
  387.   { ASR, ACC  },            // FD
  388.   { ASRD, IMP },            // FE
  389.   { LSLD, IMP }             // FF
  390. };
  391.  
  392. unsigned DasmCCPU(char *buffer, unsigned pc)
  393. {
  394.     char ambuffer [ 40 ];    /* text buffer for addressing mode values */
  395.     CINEBYTE opcode;
  396.     CINEBYTE opsize = 1;
  397.  
  398.     /* which opcode in opcode table? (includes immediate data) */
  399.     opcode = CCPU_FETCH (pc);
  400.  
  401.     /* build addressing mode (value to opcode) */
  402.     memset(ambuffer, 0, sizeof(ambuffer));
  403.     switch (amodes [ opcode_table [ opcode ].ot_amode ].ad_amode)
  404.     {
  405.     /* 4-bit immediate value */
  406.     case AIM4:
  407.     case IM4:
  408.         sprintf (ambuffer, "#$%X", opcode & 0x0F);
  409.         break;
  410.  
  411.     /* 4-bit extended immediate value */
  412.     case AIM4X:
  413.         sprintf (ambuffer, "#$%X", (opcode & 0x0F) << 8);
  414.         break;
  415.  
  416.     /* 8-bit immediate value */
  417.     case AIM8:
  418.         sprintf (ambuffer, "#$%02X", CCPU_FETCH (pc + 1));
  419.         opsize ++; /* required second byte for value */
  420.         break;
  421.  
  422.     /* [m] -- indirect through memory */
  423.     case AINDM:
  424.         sprintf (ambuffer, "AINDM/Error");
  425.         break;
  426.  
  427.     /* [i] -- indirect through 'I' */
  428.     case AIRG:
  429.     case IRG:
  430.         sprintf (ambuffer, "[i]");
  431.         break;
  432.  
  433.     /* extended 12-bit immediate value */
  434.     case AIMX:
  435.         sprintf (ambuffer, "AIMX/Error");
  436.         break;
  437.  
  438.     /* no special params */
  439.     case ACC:
  440.     case AXLT:
  441.     case IMP:
  442.         ambuffer [ 0 ] = '\0';
  443.         break;
  444.  
  445.     /* 12-bit immediate value */
  446.     case IM12:
  447.         sprintf (ambuffer, "#$%03X",
  448.             (CCPU_FETCH (pc) & 0x0F) +
  449.             (CCPU_FETCH (pc + 1) & 0xF0) +
  450.             ((CCPU_FETCH (pc + 1) & 0x0F) << 8));
  451.         opsize ++;
  452.         break;
  453.  
  454.     /* display address of direct addressing modes */
  455.     case ADIR:
  456.     case DIR:
  457.         sprintf (ambuffer, "$%X", opcode & 0x0F);
  458.         break;
  459.  
  460.     /* jump through J register */
  461.     case JUMP:
  462.         sprintf (ambuffer, "<jump>");
  463.         break;
  464.  
  465.     /* extended jump */
  466.     case JUMPX:
  467.         sprintf (ambuffer, "JUMPX/Error");
  468.         break;
  469.  
  470.     } /* switch on addressing mode */
  471.  
  472. #if NEVERDEF
  473.     /* build flags dump */
  474.     sprintf (flbuffer,
  475.         "A=%03X B=%03X I=%03XZ J=%03X P=%X " \
  476.         "A0=%02X %02X N%X O%X %c%c%c%c",
  477.         register_A, register_B,
  478.         register_I << 1,               /* use the <<1 for Zonn style */
  479.         register_J, register_P, GETA0(),
  480.         GETFC() /* ? 'C' : 'c' */,
  481.         cmp_new, cmp_old,
  482.         ((state == state_A) || (state == state_AA)) ? 'A' : ' ',
  483.         (state == state_AA) ? 'A' : ' ',
  484.         ((state == state_B) || (state == state_BB)) ? 'B' : ' ',
  485.         (state == state_BB) ? 'B' : ' ');
  486. #endif
  487.  
  488.     /* create final output */
  489.     sprintf (buffer, "%-5s%s",
  490.         opcodes [ opcode_table [ opcode ].ot_opcode ].od_name, ambuffer);
  491.  
  492.     return opsize;
  493. }
  494.